package chat.client.service;

import chat.client.view.ClientView;
import chat.tools.ServiceTools;
import chat.tools.TimerTools;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;

/**
 * 客户端事件处理业务类
 *
 * #1 实现每一个按钮对应的功能
 * #2 实现客户端功能
 *
 * @author 谈笑、
 * @dateTime 2020/10/21 15:41
 */
public class ClientService {

	// 客户端功能实现类
	private ClientCore clientCore;

	// 连接时长计时器
	private TimerTools timerTools;

	// 客户端名称
	private String clientName;

	/**
	 * #1 发送输入框内的报文
	 */
	public void sendMsg(ClientView clientView) {
		// 获取到报文输入框中的数据
		String msg = clientView.getjTextAreas()[1].getText();

		// 判断是否输入
		if(ServiceTools.isJTextAreaInput(msg)) {

			// 判断第二个单选按钮是否被选中，第二个单选按钮被选中是多向通信，反之是单向通信。
			if(clientView.getjRadioButtons()[1].isSelected()) {
				// 发送多向通信报文
				this.clientCore.sengMsg(msg);

				// 清空输入框内的内容
				clientView.getjTextAreas()[1].setText("");

			} else {

				// 获取到单向通信选中的客户
				String clientName = clientView.getjList().getSelectedValue();

				// 选中的客户端名不为空
				if(clientName != null && !"".equals(clientName)) {
					// 选中的客户端不能为自己
					if(!this.clientName.equals(clientName)) {

						// 组合单向通信报文
						String info = "@D_F_T_X@" + "*K_G*" + clientName + "*K_G*" + msg;

						// 发送单向通信报文
						this.clientCore.sengMsg(info);

						// 清空输入框内的内容
						clientView.getjTextAreas()[1].setText("");

						// 添加私聊消息记录
						clientView.getjTextAreas()[0].append("[你向 @" + clientName
								+ " 发送了一条报文 " + ServiceTools.getCurrentDateTime() +  "]：" + msg + "\n");

					} else {

						// 自己向自己发消息
						ServiceTools.tipsFrame(clientView.getjFrame(), "请不要自娱自乐");
					}

				} else {

					// 没有选择通信的客户端
					ServiceTools.tipsFrame(clientView.getjFrame(), "请选择需要通信的客户端");
				}
			}

		} else {

			// 没有输入内容弹出提示框
			ServiceTools.tipsFrame(clientView.getjFrame(), "还没有输入任何内容");
		}

	}


	/**
	 * #2 复制输入框内的报文
	 */
	public void copyMsg(ClientView clientView) {
		// 获取到报文输入框内的数据
		String data = clientView.getjTextAreas()[1].getText();

		// 判断报文输入框内是否输入了内容
		if(ServiceTools.isJTextAreaInput(data)) {

			// 将报文输入框的内容复制到剪贴板
			Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
			clipboard.setContents(new StringSelection(data), null);

		} else{

			// 没有输入内容弹出提示框
			ServiceTools.tipsFrame(clientView.getjFrame(), "还没有输入任何内容");
		}
	}


	/**
	 * #3 清空输入框内的报文
	 */
	public void emptyMsg(ClientView clientView) {
		// 判断报文输入框内是否输入了内容
		if(ServiceTools.isJTextAreaInput(clientView.getjTextAreas()[1].getText())) {
			// 将报文输入框内的内容清空
			clientView.getjTextAreas()[1].setText("");
		} else{
			// 没有输入内容弹出提示框
			ServiceTools.tipsFrame(clientView.getjFrame(), "还没有输入任何内容");
		}
	}


	/**
	 * #4 连接服务器
	 */
	public void connectServer(ClientView clientView) {
		// 获取到配置的服务器IP地址
		String ip = clientView.getjTextFields()[0].getText();

		// 获取到配置的服务器端口号
		String  port = clientView.getjTextFields()[1].getText();

		//获取到配置的客户端名称
		String name = clientView.getjTextFields()[2].getText();

		// 判断是否输入了数据
		if(ServiceTools.isJTextFieldInput(ip, port, name)) {

			// 创捷客户端
			this.clientCore = new ClientCore(clientView, name);

			// 连接到指定的服务器
			if(this.clientCore.connectServer(ip, Integer.parseInt(port))) {

				// 初始化客户端名称
				this.clientName = name;

				// 启动收、发报文线程
				new Thread(this.clientCore).start();

				// 启动连接时长计时器
				this.timerTools = new TimerTools(clientView.getjLabels()[7], "连接服务时长");
				new Thread(this.timerTools).start();

				// 传递计时器对象，在发生异常时停止计时。
				this.clientCore.setTimerTools(this.timerTools);

				// 修改客户端样式
				ServiceTools.setStartClientWindowStyle(clientView);

			} else {

				// 连接失败
				ServiceTools.tipsFrame(clientView.getjFrame(),
						"连接服务器失败，请检查设置的IP地址、端口号\n和客户端名称是否正确。");
			}

		} else{

			// 没有配置好服务器连接参数
			ServiceTools.tipsFrame(clientView.getjFrame(), "服务器IP地址或端口号或客户端名称未设置！");
		}

	}


	/**
	 * #5 断开连接
	 */
	public void breakConnect() {
		// 结束计时
		this.timerTools.setTimerToolsRun();

		// 结束客户端运行
		this.clientCore.closeClientConnect();
	}


	/**
	 * #6、#7 退出程序和关闭窗体退出程序
	 */
	public void clientSignOut(ClientView clientView) {
		// 获取到客户端运行状态
		if(this.clientCore != null && this.clientCore.getClientCoreRun()) {

			// 确认是否退出程序
			int result = ServiceTools.confirmFrame(clientView.getjFrame(),
					"当前客户端已连接到服务器，退出程序将\n断开连接，是否退出?");

			// 没有点击确定
			if(result != 0) {
				clientView.getjFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
				return;
			}

		} else {
			// 确认是否退出程序
			int result = ServiceTools.confirmFrame(clientView.getjFrame(), "是否退出程序?");
			// 没有点击确定
			if(result != 0) {
				clientView.getjFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
				return;
			}
		}

		// 创建过客户端才能关闭
		if(this.clientCore != null) {
			// 结束客户端运行
			this.clientCore.closeClientConnect();
		}

		// 关闭客户端窗体
		clientView.getjFrame().dispose();

		// 退出虚拟机
		System.exit(1);
	}

}